ArcGIS Engine追加功能 您所在的位置:网站首页 arcengine gp工具 ArcGIS Engine追加功能

ArcGIS Engine追加功能

2024-06-18 05:03| 来源: 网络整理| 查看: 265

最近又研究了ArcGIS中的一个追加功能,如果你的ArcMap是中文版的话,可以通过“toolbox—>数据管理工具—>常规—>追加”这几步找到他,如果你是英文,那…那你就去翻译一下吧(ps:图有点长就没截)!

这个功能逻辑倒是不复杂,困难的地方主要是参数的设置,尤其是字段映射那一块,我靠着反复的在ArcMap中尝试与对接口的了解(其实是瞎蒙),竟然解决了映射问题!

这其中主要使用的接口有IGPFieldMapping、IDETable、IGPFieldMap;其中IGPFieldMapping、IGPFieldMap这两个接口比较重要,而且比较神奇;既然是字段映射,所以字段之间必须有一个对应关系,IGPFieldMapping有一个对应的CoClass共有类GPFieldMappingClass,可以直接new出来,但是这个接口必须进行初始化操作,还是来看代码吧,实在不好解释!

IGPFieldMapping fieldmapping = new GPFieldMappingClass(); IGPUtilities gputilities = new GPUtilitiesClass(); string path=""; if (((IDataset)this.mInpusFeatureclass).Workspace.Type == esriWorkspaceType.esriLocalDatabaseWorkspace) { path = this.strShapePath + "\\" + ((IDataset)this.mInpusFeatureclass).Name; } else if (((IDataset)this.mInpusFeatureclass).Workspace.Type == esriWorkspaceType.esriFileSystemWorkspace) { path = this.strShapePath + "\\" + ((IDataset)this.mInpusFeatureclass).Name; } else if (((IDataset)this.mInpusFeatureclass).Workspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace) { path = this.strShapePath; } IDETable inputTableA = (IDETable)gputilities.MakeDataElement(path, null, null); IArray inputtables = new ArrayClass(); inputtables.Add(inputTableA); fieldmapping.Initialize(inputtables, null);

这里的mInpusFeatureclass是我们用来映射的数据源要素类,得到映射字段,还有一个mTargetFeatureclass是被映射要素类。 这里的代码我们需要注意的是不同的数据源的路径不相同,不过最小都需要定位到具体的FeatureClass,这里的fieldmapping初始化过后就会自动的剔除一些不能被映射的字段,如OBJECTID与SHAPE字段等(但是我不懂为什么shape.len与shape.area竟然没有被排除),之后我们需要进一步处理这个字段映射对象,将我们设置的映射字段加入进去,

this.mTargetGPFieldMapping.RemoveAll();//首先需要清除里面的字段映射 foreach (var item in pFieldMappingDic.Keys)//这个字典里面存储了自定义的映射字段 { if (pFieldMappingDic[item.ToString()] == "") continue;//可以不设置字段映射 IGPFieldMap trackid = new GPFieldMapClass(); trackid.OutputField = GetFieldByName(this.mTargetFeatureclass, item.ToString()); trackid.MergeRule = esriGPFieldMapMergeRule.esriGPFieldMapMergeRuleLast; int fieldmap_index = this.mInputGPFieldMapping.FindFieldMap(pFieldMappingDic[item.ToString()]); IGPFieldMap stfid_fieldmap = this.mInputGPFieldMapping.GetFieldMap(fieldmap_index); int field_index = stfid_fieldmap.FindInputField(this.mInputDETable, pFieldMappingDic[item.ToString()]); IField inputField = stfid_fieldmap.GetField(field_index); trackid.AddInputField(this.mInputDETable, inputField, -1, -1); this.mTargetGPFieldMapping.AddFieldMap(trackid);//将IGPFieldMap添加到IGPFieldMapping中去,所以后者相当于前者的集合 }

最后使用GP工具中的Append工具执行操作!

总结 这个功能总体来说并不困难,困难的是ESRI的帮助文档基本没说啥有用的,基本靠自己连蒙带猜将接口里面的方法怎么用给猜测出来,不过做出来还是有点成就感的!(ps:希望给大家带来帮助,如果有什么不明白的,可以留言询问,我看到了会第一时间回复)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有